]> dgit.raspbian.org Git - gnome-shell.git/commitdiff
screenShield: Don't unnecessarily close or recreate inhibitors
authorSebastian Keller <skeller@gnome.org>
Fri, 23 Jul 2021 15:35:00 +0000 (17:35 +0200)
committerMarge Bot <marge-bot@gnome.org>
Mon, 16 Aug 2021 00:28:52 +0000 (00:28 +0000)
ScreenShield::_syncInhibitor() was closing (and recreating) the
inhibitor everytime it was called, even if no change was needed.
This gets called in various places, including on property changes in
the login1 dbus object. These happen by the time logind already started
suspending at which point new inhibitors can no longer be created. It is
only waiting for existing inhibitors to be closed, so closing the
inhibitor without a new inhibitor will cause the suspending to proceed
immediately if no other inhibitors are present. This can also happen
before the lock screen is shown, which will then complete after resume.

Fix this by keeping track of the expected inhibition state and only
create or close inhibitors if there was a change to that.

Fixes https://gitlab.gnome.org/GNOME/gnome-shell/-/issues/3736

Part-of: <https://gitlab.gnome.org/GNOME/gnome-shell/-/merge_requests/1927>

js/ui/screenShield.js

index 59c13d8b5f88fe62a2b02d5737fe8180a64ea9e6..de8b7f409e20adba4f9e436f1ae6feec971c4fc8 100644 (file)
@@ -122,6 +122,7 @@ var ScreenShield = class {
         this._isActive = false;
         this._isLocked = false;
         this._inUnlockAnimation = false;
+        this._inhibited = false;
         this._activationTime = 0;
         this._becameActiveId = 0;
         this._lockTimeoutId = 0;
@@ -203,20 +204,29 @@ var ScreenShield = class {
     }
 
     _syncInhibitor() {
-        let lockEnabled = this._settings.get_boolean(LOCK_ENABLED_KEY);
-        let lockLocked = this._lockSettings.get_boolean(DISABLE_LOCK_KEY);
-        let inhibit = this._loginSession && this._loginSession.Active &&
-                       !this._isActive && lockEnabled && !lockLocked && Main.sessionMode.unlockDialog;
+        const lockEnabled = this._settings.get_boolean(LOCK_ENABLED_KEY);
+        const lockLocked = this._lockSettings.get_boolean(DISABLE_LOCK_KEY);
+        const inhibit = !!this._loginSession && this._loginSession.Active &&
+                         !this._isActive && lockEnabled && !lockLocked &&
+                         !!Main.sessionMode.unlockDialog;
+
+        if (inhibit === this._inhibited)
+            return;
+
+        this._inhibited = inhibit;
+
         if (inhibit) {
-            this._loginManager.inhibit(_("GNOME needs to lock the screen"),
+            this._loginManager.inhibit(_('GNOME needs to lock the screen'),
                 inhibitor => {
-                    if (this._inhibitor)
-                        this._inhibitor.close(null);
-                    this._inhibitor = inhibitor;
+                    if (inhibitor) {
+                        if (this._inhibitor)
+                            inhibitor.close(null);
+                        else
+                            this._inhibitor = inhibitor;
+                    }
                 });
         } else {
-            if (this._inhibitor)
-                this._inhibitor.close(null);
+            this._inhibitor?.close(null);
             this._inhibitor = null;
         }
     }